<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/jump_label.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/jump_label.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0pVTVBfTEFCRUxfSF8w"><span class="b">_LINUX_JUMP_LABEL_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0pVTVBfTEFCRUxfSF8w"><span class="b">_LINUX_JUMP_LABEL_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="k">/*</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="k"> * Jump label support</span>
<a name="6" /><span class="Maybe">       6:</span> <span class="k"> *</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="k"> * Copyright (C) 2009-2012 Jason Baron &lt;jbaron@redhat.com&gt;</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="k"> * Copyright (C) 2011-2012 Peter Zijlstra &lt;pzijlstr@redhat.com&gt;</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="k"> *</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="k"> * Jump labels provide an interface to generate dynamic branches using</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="k"> * self-modifying code. Assuming toolchain and architecture support the result</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="k"> * of a &quot;if (static_key_false(&amp;key))&quot; statement is a unconditional branch (which</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="k"> * defaults to false - and the true block is placed out of line).</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="k"> *</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="k"> * However at runtime we can change the branch target using</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="k"> * static_key_slow_{inc,dec}(). These function as a &apos;reference&apos; count on the key</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="k"> * object and for as long as there are references all branches referring to</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="k"> * that particular key will point to the (out of line) true block.</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="k"> *</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="k"> * Since this relies on modifying code the static_key_slow_{inc,dec}() functions</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="k"> * must be considered absolute slow paths (machine wide synchronization etc.).</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k"> * OTOH, since the affected branches are unconditional their runtime overhead</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k"> * will be absolutely minimal, esp. in the default (off) case where the total</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k"> * effect is a single NOP of appropriate size. The on case will patch in a jump</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="k"> * to the out-of-line block.</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="k"> *</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="k"> * When the control is directly exposed to userspace it is prudent to delay the</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="k"> * decrement to avoid high frequency code modifications which can (and do)</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> * cause significant performance degradation. Struct static_key_deferred and</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k"> * static_key_slow_dec_deferred() provide for this.</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> *</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> * Lacking toolchain and or architecture support, it falls back to a simple</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="k"> * conditional branch.</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="k"> *</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> * struct static_key my_key = STATIC_KEY_INIT_TRUE;</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k"> *</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> *   if (static_key_true(&amp;my_key)) {</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> *   }</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> *</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> * will result in the true case being in-line and starts the key with a single</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="k"> * reference. Mixing static_key_true() and static_key_false() on the same key is not</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="k"> * allowed.</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="k"> *</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="k"> * Not initializing the key (static data is initialized to 0s anyway) is the</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k"> * same as using STATIC_KEY_INIT_FALSE.</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="k"> *</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="k">*/</span>
<a name="48" /><span class="Maybe">      48:</span> 
<a name="49" /><span class="Maybe">      49:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="50" /><span class="Maybe">      50:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">compiler</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="51" /><span class="Maybe">      51:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">bug</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="52" /><span class="Maybe">      52:</span> 
<a name="53" /><span class="Maybe">      53:</span> <span class="m">extern</span> <span class="m">bool</span> <span class="b">static_key_initialized</span><span class="f">;</span>
<a name="54" /><span class="Maybe">      54:</span> 
<a name="55" /><span class="Maybe">      55:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U1RBVElDX0tFWV9DSEVDS19VU0VfMA__"><span class="b">STATIC_KEY_CHECK_USE</span></a><span class="f">(</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_V0FSTl8w"><span class="b">WARN</span></a><span class="f">(</span><span class="f">!</span><span class="b">static_key_initialized</span><span class="f">,</span>              \
<a name="56" /><span class="Maybe">      56:</span>                     <span class="e">&quot;%s used before call to jump_label_init&quot;</span><span class="f">,</span> \
<a name="57" /><span class="Maybe">      57:</span>                     <span class="b">__func__</span><span class="f">)</span>
<a name="58" /><span class="Maybe">      58:</span> 
<a name="59" /><span class="False">      59:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><span class="b">CC_HAVE_ASM_GOTO</span><span class="f">)</span> <span class="f">&amp;&amp;</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_JUMP_LABEL</span><span class="f">)</span>
<a name="60" /><span class="False">      60:</span> 
<a name="61" /><span class="False">      61:</span> <span class="m">struct</span> <span class="b">static_key</span> <span class="f">{</span>
<a name="62" /><span class="False">      62:</span>     <span class="b">atomic_t</span> <span class="b">enabled</span><span class="f">;</span>
<a name="63" /><span class="False">      63:</span> <span class="k">/* Set lsb bit to 1 if branch is default true, 0 ot */</span>
<a name="64" /><span class="False">      64:</span>     <span class="m">struct</span> <span class="b">jump_entry</span> <span class="f">*</span><span class="b">entries</span><span class="f">;</span>
<a name="65" /><span class="False">      65:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX01PRFVMRVNfMA__"><span class="b">CONFIG_MODULES</span></a>
<a name="66" /><span class="False">      66:</span>     <span class="m">struct</span> <span class="b">static_key_mod</span> <span class="f">*</span><span class="b">next</span><span class="f">;</span>
<a name="67" /><span class="False">      67:</span> <span class="f">#</span><span class="n">endif</span>
<a name="68" /><span class="False">      68:</span> <span class="f">}</span><span class="f">;</span>
<a name="69" /><span class="False">      69:</span> 
<a name="70" /><span class="False">      70:</span> <span class="f">#</span> <span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">jump_label</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="71" /><span class="False">      71:</span> <span class="f">#</span> <span class="n">define</span> <span class="b">HAVE_JUMP_LABEL</span>
<a name="72" /><span class="Maybe">      72:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* CC_HAVE_ASM_GOTO &amp;&amp; CONFIG_JUMP_LABEL */</span>
<a name="73" /><span class="Maybe">      73:</span> 
<a name="74" /><span class="Maybe">      74:</span> <span class="m">enum</span> <span class="b">jump_label_type</span> <span class="f">{</span>
<a name="75" /><span class="Maybe">      75:</span>     <span class="b">JUMP_LABEL_DISABLE</span> <span class="f">=</span> <span class="c">0</span><span class="f">,</span>
<a name="76" /><span class="Maybe">      76:</span>     <span class="b">JUMP_LABEL_ENABLE</span><span class="f">,</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="f">}</span><span class="f">;</span>
<a name="78" /><span class="Maybe">      78:</span> 
<a name="79" /><span class="Maybe">      79:</span> <span class="m">struct</span> <span class="b">module</span><span class="f">;</span>
<a name="80" /><span class="Maybe">      80:</span> 
<a name="81" /><span class="Maybe">      81:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">atomic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="82" /><span class="False">      82:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">HAVE_JUMP_LABEL</span>
<a name="83" /><span class="False">      83:</span> 
<a name="84" /><span class="False">      84:</span> <span class="f">#</span><span class="n">define</span> <span class="b">JUMP_LABEL_TRUE_BRANCH</span> <span class="c">1UL</span>
<a name="85" /><span class="False">      85:</span> 
<a name="86" /><span class="False">      86:</span> <span class="m">static</span>
<a name="87" /><span class="False">      87:</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">jump_entry</span> <span class="f">*</span><span class="b">jump_label_get_entries</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="88" /><span class="False">      88:</span> <span class="f">{</span>
<a name="89" /><span class="False">      89:</span>     <span class="m">return</span> <span class="f">(</span><span class="m">struct</span> <span class="b">jump_entry</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="b">key</span><span class="f">-&gt;</span><span class="b">entries</span>
<a name="90" /><span class="False">      90:</span>                         <span class="f">&amp;</span> <span class="f">~</span><span class="b">JUMP_LABEL_TRUE_BRANCH</span><span class="f">)</span><span class="f">;</span>
<a name="91" /><span class="False">      91:</span> <span class="f">}</span>
<a name="92" /><span class="False">      92:</span> 
<a name="93" /><span class="False">      93:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">jump_label_get_branch_default</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="94" /><span class="False">      94:</span> <span class="f">{</span>
<a name="95" /><span class="False">      95:</span>     <span class="m">if</span> <span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="b">key</span><span class="f">-&gt;</span><span class="b">entries</span> <span class="f">&amp;</span> <span class="b">JUMP_LABEL_TRUE_BRANCH</span><span class="f">)</span>
<a name="96" /><span class="False">      96:</span>         <span class="m">return</span> <span class="m">true</span><span class="f">;</span>
<a name="97" /><span class="False">      97:</span>     <span class="m">return</span> <span class="m">false</span><span class="f">;</span>
<a name="98" /><span class="False">      98:</span> <span class="f">}</span>
<a name="99" /><span class="False">      99:</span> 
<a name="100" /><span class="False">     100:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">bool</span> <span class="b">static_key_false</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="101" /><span class="False">     101:</span> <span class="f">{</span>
<a name="102" /><span class="False">     102:</span>     <span class="m">return</span> <span class="b">arch_static_branch</span><span class="f">(</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="103" /><span class="False">     103:</span> <span class="f">}</span>
<a name="104" /><span class="False">     104:</span> 
<a name="105" /><span class="False">     105:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">bool</span> <span class="b">static_key_true</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="106" /><span class="False">     106:</span> <span class="f">{</span>
<a name="107" /><span class="False">     107:</span>     <span class="m">return</span> <span class="f">!</span><span class="b">static_key_false</span><span class="f">(</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="108" /><span class="False">     108:</span> <span class="f">}</span>
<a name="109" /><span class="False">     109:</span> 
<a name="110" /><span class="False">     110:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">jump_entry</span> <span class="b">__start___jump_table</span><span class="f">[</span><span class="f">]</span><span class="f">;</span>
<a name="111" /><span class="False">     111:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">jump_entry</span> <span class="b">__stop___jump_table</span><span class="f">[</span><span class="f">]</span><span class="f">;</span>
<a name="112" /><span class="False">     112:</span> 
<a name="113" /><span class="False">     113:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">jump_label_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="114" /><span class="False">     114:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">jump_label_lock</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="115" /><span class="False">     115:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">jump_label_unlock</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="116" /><span class="False">     116:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">arch_jump_label_transform</span><span class="f">(</span><span class="m">struct</span> <span class="b">jump_entry</span> <span class="f">*</span><span class="b">entry</span><span class="f">,</span>
<a name="117" /><span class="False">     117:</span>                       <span class="m">enum</span> <span class="b">jump_label_type</span> <span class="b">type</span><span class="f">)</span><span class="f">;</span>
<a name="118" /><span class="False">     118:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">arch_jump_label_transform_static</span><span class="f">(</span><span class="m">struct</span> <span class="b">jump_entry</span> <span class="f">*</span><span class="b">entry</span><span class="f">,</span>
<a name="119" /><span class="False">     119:</span>                          <span class="m">enum</span> <span class="b">jump_label_type</span> <span class="b">type</span><span class="f">)</span><span class="f">;</span>
<a name="120" /><span class="False">     120:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">jump_label_text_reserved</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">start</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">end</span><span class="f">)</span><span class="f">;</span>
<a name="121" /><span class="False">     121:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">static_key_slow_inc</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="122" /><span class="False">     122:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">static_key_slow_dec</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="123" /><span class="False">     123:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">jump_label_apply_nops</span><span class="f">(</span><span class="m">struct</span> <span class="b">module</span> <span class="f">*</span><span class="b">mod</span><span class="f">)</span><span class="f">;</span>
<a name="124" /><span class="False">     124:</span> 
<a name="125" /><span class="False">     125:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBVElDX0tFWV9JTklUX1RSVUVfMA__"><span class="b">STATIC_KEY_INIT_TRUE</span></a> <span class="f">(</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span><span class="f">)</span> \
<a name="126" /><span class="False">     126:</span>     <span class="f">{</span> <span class="f">.</span><span class="b">enabled</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_QVRPTUlDX0lOSVRfMA__"><span class="b">ATOMIC_INIT</span></a><span class="f">(</span><span class="c">1</span><span class="f">)</span><span class="f">,</span> <span class="f">.</span><span class="b">entries</span> <span class="f">=</span> <span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="c">1</span> <span class="f">}</span><span class="f">)</span>
<a name="127" /><span class="False">     127:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBVElDX0tFWV9JTklUX0ZBTFNFXzA_"><span class="b">STATIC_KEY_INIT_FALSE</span></a> <span class="f">(</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span><span class="f">)</span> \
<a name="128" /><span class="False">     128:</span>     <span class="f">{</span> <span class="f">.</span><span class="b">enabled</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_QVRPTUlDX0lOSVRfMA__"><span class="b">ATOMIC_INIT</span></a><span class="f">(</span><span class="c">0</span><span class="f">)</span><span class="f">,</span> <span class="f">.</span><span class="b">entries</span> <span class="f">=</span> <span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="c">0</span> <span class="f">}</span><span class="f">)</span>
<a name="129" /><span class="False">     129:</span> 
<a name="130" /><span class="Maybe">     130:</span> <span class="f">#</span><span class="n">else</span>  <span class="k">/* !HAVE_JUMP_LABEL */</span>
<a name="131" /><span class="Maybe">     131:</span> 
<a name="132" /><span class="Maybe">     132:</span> <span class="m">struct</span> <span class="b">static_key</span> <span class="f">{</span>
<a name="133" /><span class="Maybe">     133:</span>     <span class="b">atomic_t</span> <span class="b">enabled</span><span class="f">;</span>
<a name="134" /><span class="Maybe">     134:</span> <span class="f">}</span><span class="f">;</span>
<a name="135" /><span class="Maybe">     135:</span> 
<a name="136" /><span class="Maybe">     136:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">void</span> <span class="b">jump_label_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="137" /><span class="Maybe">     137:</span> <span class="f">{</span>
<a name="138" /><span class="Maybe">     138:</span>     <span class="b">static_key_initialized</span> <span class="f">=</span> <span class="m">true</span><span class="f">;</span>
<a name="139" /><span class="Maybe">     139:</span> <span class="f">}</span>
<a name="140" /><span class="Maybe">     140:</span> 
<a name="141" /><span class="Maybe">     141:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">bool</span> <span class="b">static_key_false</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="142" /><span class="Maybe">     142:</span> <span class="f">{</span>
<a name="143" /><span class="Maybe">     143:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="b">atomic_read</span><span class="f">(</span><span class="f">&amp;</span><span class="b">key</span><span class="f">-&gt;</span><span class="b">enabled</span><span class="f">)</span> <span class="f">&gt;</span> <span class="c">0</span><span class="f">)</span><span class="f">)</span>
<a name="144" /><span class="Maybe">     144:</span>         <span class="m">return</span> <span class="m">true</span><span class="f">;</span>
<a name="145" /><span class="Maybe">     145:</span>     <span class="m">return</span> <span class="m">false</span><span class="f">;</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="f">}</span>
<a name="147" /><span class="Maybe">     147:</span> 
<a name="148" /><span class="Maybe">     148:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">bool</span> <span class="b">static_key_true</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="149" /><span class="Maybe">     149:</span> <span class="f">{</span>
<a name="150" /><span class="Maybe">     150:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><span class="b">atomic_read</span><span class="f">(</span><span class="f">&amp;</span><span class="b">key</span><span class="f">-&gt;</span><span class="b">enabled</span><span class="f">)</span> <span class="f">&gt;</span> <span class="c">0</span><span class="f">)</span><span class="f">)</span>
<a name="151" /><span class="Maybe">     151:</span>         <span class="m">return</span> <span class="m">true</span><span class="f">;</span>
<a name="152" /><span class="Maybe">     152:</span>     <span class="m">return</span> <span class="m">false</span><span class="f">;</span>
<a name="153" /><span class="Maybe">     153:</span> <span class="f">}</span>
<a name="154" /><span class="Maybe">     154:</span> 
<a name="155" /><span class="Maybe">     155:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">static_key_slow_inc</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="f">{</span>
<a name="157" /><span class="Maybe">     157:</span>     <a href="cpu.c_macros_ref.html#_U1RBVElDX0tFWV9DSEVDS19VU0VfMA__"><span class="b">STATIC_KEY_CHECK_USE</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="158" /><span class="Maybe">     158:</span>     <span class="b">atomic_inc</span><span class="f">(</span><span class="f">&amp;</span><span class="b">key</span><span class="f">-&gt;</span><span class="b">enabled</span><span class="f">)</span><span class="f">;</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="f">}</span>
<a name="160" /><span class="Maybe">     160:</span> 
<a name="161" /><span class="Maybe">     161:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">static_key_slow_dec</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="f">{</span>
<a name="163" /><span class="Maybe">     163:</span>     <a href="cpu.c_macros_ref.html#_U1RBVElDX0tFWV9DSEVDS19VU0VfMA__"><span class="b">STATIC_KEY_CHECK_USE</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="164" /><span class="Maybe">     164:</span>     <span class="b">atomic_dec</span><span class="f">(</span><span class="f">&amp;</span><span class="b">key</span><span class="f">-&gt;</span><span class="b">enabled</span><span class="f">)</span><span class="f">;</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="f">}</span>
<a name="166" /><span class="Maybe">     166:</span> 
<a name="167" /><span class="Maybe">     167:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">jump_label_text_reserved</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">start</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">end</span><span class="f">)</span>
<a name="168" /><span class="Maybe">     168:</span> <span class="f">{</span>
<a name="169" /><span class="Maybe">     169:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="170" /><span class="Maybe">     170:</span> <span class="f">}</span>
<a name="171" /><span class="Maybe">     171:</span> 
<a name="172" /><span class="Maybe">     172:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">jump_label_lock</span><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="173" /><span class="Maybe">     173:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">jump_label_unlock</span><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="174" /><span class="Maybe">     174:</span> 
<a name="175" /><span class="Maybe">     175:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">jump_label_apply_nops</span><span class="f">(</span><span class="m">struct</span> <span class="b">module</span> <span class="f">*</span><span class="b">mod</span><span class="f">)</span>
<a name="176" /><span class="Maybe">     176:</span> <span class="f">{</span>
<a name="177" /><span class="Maybe">     177:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="178" /><span class="Maybe">     178:</span> <span class="f">}</span>
<a name="179" /><span class="Maybe">     179:</span> 
<a name="180" /><span class="Maybe">     180:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBVElDX0tFWV9JTklUX1RSVUVfMA__"><span class="b">STATIC_KEY_INIT_TRUE</span></a> <span class="f">(</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span><span class="f">)</span> \
<a name="181" /><span class="Maybe">     181:</span>         <span class="f">{</span> <span class="f">.</span><span class="b">enabled</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_QVRPTUlDX0lOSVRfMA__"><span class="b">ATOMIC_INIT</span></a><span class="f">(</span><span class="c">1</span><span class="f">)</span> <span class="f">}</span><span class="f">)</span>
<a name="182" /><span class="Maybe">     182:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBVElDX0tFWV9JTklUX0ZBTFNFXzA_"><span class="b">STATIC_KEY_INIT_FALSE</span></a> <span class="f">(</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span><span class="f">)</span> \
<a name="183" /><span class="Maybe">     183:</span>         <span class="f">{</span> <span class="f">.</span><span class="b">enabled</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_QVRPTUlDX0lOSVRfMA__"><span class="b">ATOMIC_INIT</span></a><span class="f">(</span><span class="c">0</span><span class="f">)</span> <span class="f">}</span><span class="f">)</span>
<a name="184" /><span class="Maybe">     184:</span> 
<a name="185" /><span class="Maybe">     185:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* HAVE_JUMP_LABEL */</span>
<a name="186" /><span class="Maybe">     186:</span> 
<a name="187" /><span class="Maybe">     187:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U1RBVElDX0tFWV9JTklUXzA_"><span class="b">STATIC_KEY_INIT</span></a> <a href="cpu.c_macros_noref.html#_U1RBVElDX0tFWV9JTklUX0ZBTFNFXzA_"><span class="b">STATIC_KEY_INIT_FALSE</span></a>
<a name="188" /><span class="Maybe">     188:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_anVtcF9sYWJlbF9lbmFibGVkXzA_"><span class="b">jump_label_enabled</span></a> <span class="b">static_key_enabled</span>
<a name="189" /><span class="Maybe">     189:</span> 
<a name="190" /><span class="Maybe">     190:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">static_key_enabled</span><span class="f">(</span><span class="m">struct</span> <span class="b">static_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span>
<a name="191" /><span class="Maybe">     191:</span> <span class="f">{</span>
<a name="192" /><span class="Maybe">     192:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">atomic_read</span><span class="f">(</span><span class="f">&amp;</span><span class="b">key</span><span class="f">-&gt;</span><span class="b">enabled</span><span class="f">)</span> <span class="f">&gt;</span> <span class="c">0</span><span class="f">)</span><span class="f">;</span>
<a name="193" /><span class="Maybe">     193:</span> <span class="f">}</span>
<a name="194" /><span class="Maybe">     194:</span> 
<a name="195" /><span class="True">     195:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* _LINUX_JUMP_LABEL_H */</span>
<a name="196" /><span class="True">     196:</span> </pre>
  </body>
</html>
